#include "HttpMgr.h"

HttpMgr::HttpMgr(){
    // 连接http请求和完成信号，信号槽机制保证队列消费
    connect(this, &HttpMgr::sig_http_finish, this, &HttpMgr::slot_http_finish);
}
HttpMgr::~HttpMgr(){

}

// PostHttpReg 请求的函数，发送http的post请求
void HttpMgr::PostHttpReq(QUrl url, QJsonObject json, ReqId req_id, Modules mod){
    // 创建一个HTTP POST请求，并设置请求头和请求体
    QByteArray data = QJsonDocument(json).toJson();
    // 通过url构造请求
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(data.length()));
    // 发送请求，并处理响应，获取自己的只能指针，构造伪闭包并增加智能指针的引用计数
    auto self = shared_from_this(); // public enable_shared_from_this<HttpMgr>
    QNetworkReply* reply = _manager.post(request, data);
    // 设置信号和槽等待发送完成
    QObject::connect(reply, &QNetworkReply::finished, [reply, self, req_id, mod](){
        // 处理错误的情况
        if(reply->error() != QNetworkReply::NoError){
            qDebug() << reply->errorString();
            // 发送信号通知完成
            emit self->sig_http_finish(req_id, "", ErrorCodes::ERR_NETWORK, mod);
            reply->deleteLater();
            return;
        }

        // 无错误则读回请求
        QString res = reply->readAll();

        // 发送信号通知完成
        emit self->sig_http_finish(req_id, res, ErrorCodes::SUCCESS, mod);
        reply->deleteLater();
        return;
    });
}

// HttpMgr单例类请求
void HttpMgr::slot_http_finish(ReqId id, QString res, ErrorCodes err, Modules mod){
    // 触发RegisterDialog注册界面http请求server服务完成
    if(mod == Modules::REGISTERMOD){
        // 发送信号通知指定模块http响应结束
        emit sig_reg_mod_finish(id, res, err);
    }

    // 触发ResetDialog重置界面http请求server(验证码和重置密码)服务完成
    if(mod == Modules::RESETMOD)
        emit sig_reset_mod_finish(id, res, err);

    // 触发LoginDialog登陆界面http(登陆)请求server服务完成
    if(mod == Modules::LOGINMOD)
        emit sig_login_mod_finish(id, res, err);
}
